package org.farec.tcc.spring.controller;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.farec.tcc.dao.GrupoDAO;
import org.farec.tcc.dao.PermissaoDAO;
import org.farec.tcc.dao.UsuarioDAO;
import org.farec.tcc.modelo.Grupo;
import org.farec.tcc.modelo.Permissao;
import org.farec.tcc.modelo.Usuario;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class GrupoController {
	
	@RequestMapping("/formGrupo")
	public String formGrupo(Model model, HttpServletRequest request)
	{	
		/*
		 * Metodo revisado no dia 04/12 e testado;
		 * 
		 */
		
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for(Permissao p : permissaoList)
		{
			if(p.getModulo().equals("Grupo") && p.getItem().equals("adicionar"))
			{
				model.addAttribute("permissoesList", daoPermissao.getLista());
				return "cadgrupo";
			}
		}
		
		return "index";
	}
	
	@RequestMapping("/adicionarGrupo")
	public String adiciona(Grupo grupo, Model model, HttpServletRequest request) throws SQLException
	{
		/*
		 * Metodo revisado no dia 04/12 e testado;
		 * 
		*/
		Connection connection = (Connection) request.getAttribute("conexao");
			
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for(Permissao p : permissaoList)
		{
			if(p.getModulo().equals("Grupo") && p.getItem().equals("adicionar"))
			{
				GrupoDAO daoGrupo = new GrupoDAO(connection);
				Map<String,List<String>> resultado = tratarParametros( request.getParameterMap() );
						
				grupo.setCodEmpresa(codEmpresa);
				grupo.setModuloPermissaoMap( resultado );
	
				Map<String, Object> params = new LinkedHashMap<String, Object>(); 
				
				if(daoGrupo.getGrupo(grupo).isAlerta() == true ) //Se existir grupo
				{
					params.put("grupo", true);
					model.addAttribute("permissoesList", daoPermissao.getLista());
					return "cadgrupo";
				}
				
				//Se nao existir grupo
				params.put("grupo", false);
				daoGrupo.adiciona(grupo);
				return "redirect:listaGrupo";
			}
		}
		
		return "index";
	}
	
	private Map<String,List<String>> tratarParametros( Map<String,String[]> param )
	{
		Map<String,List<String>> resultado = new HashMap<>();
		
		for( Entry<String,String[]> entry : param.entrySet() )
		{
			if( entry.getKey().indexOf( "_" ) <= 0 )
			{
				continue ;
			}
			
			String[] partes = entry.getKey().split( "_" );
			String acao   = partes[0];
			String modulo = partes[1];
			
			if( !resultado.containsKey( modulo ) )
			{
				resultado.put( modulo , new ArrayList<String>() );
			}
			
			resultado.get( modulo ).add( acao );
		}
		
		return resultado;
	}
	
	@RequestMapping("/listaGrupo")
	public String lista(Model model, HttpServletRequest request)
	{
		/*
		 * Metodo revisado no dia 10/01 e testado;
		 * 
		 */
		
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for(Permissao p : permissaoList)
		{
			if(p.getModulo().equals("Grupo") && p.getItem().equals("adicionar"))
			{
				GrupoDAO dao = new GrupoDAO(connection);
				
				model.addAttribute("permissoesList", permissaoList);
				model.addAttribute("grupos", dao.getLista(codEmpresa, "id"));
				return "grupo";
			}
		}
		
		return "index";
	}
	
	@RequestMapping("/exibeGrupo")
	public String mostra(String nome, Model model, HttpServletRequest request)
	{	
		/*
		 * Metodo revisado no dia 04/12 e testado;
		 * 
		 */
		
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for( Permissao p : permissaoList )
		{
			if( p.getModulo().equals("Grupo") && p.getItem().equals("alterar"))
			{
				GrupoDAO daoGrupo = new GrupoDAO(connection);
				//PermissaoDAO daoPermissao2 = new PermissaoDAO(connection);
				
				Grupo grupo = daoGrupo.buscaDados(codEmpresa, nome );
				List<Permissao> permissaoList2 = daoPermissao.getLista();
				
				/*
				 * Lista todas as permissoes possiveis no sistem
				*/
				for( Permissao permissao : permissaoList2 )
				{
					if( !grupo.getModuloPermissaoMap().containsKey( permissao.getModulo() ) )
					{
						grupo.getModuloPermissaoMap().put( permissao.getModulo() , new ArrayList<String>() );
					}
				}
				
				Map<String,Set<String>> map = new HashMap<>();
				for( Entry<String, List<String>> entry :  grupo.getModuloPermissaoMap().entrySet() )
				{
					map.put( entry.getKey() , new HashSet<String>() );
					
					for( String val : entry.getValue() )
					{
						if( val != null )
						{
							map.get( entry.getKey() ).add( val.toLowerCase() );
						}
					}
				}
				
				// ---------------------------------------------
				// ---------------------------------------------
				
				List<String> chaveList = new LinkedList<>( map.keySet() );
				Collections.sort( chaveList );
				
				Map<String,Set<String>> reordenadoMap = new LinkedHashMap<>();
				for(  String key : chaveList )
				{
					reordenadoMap.put( key , map.get( key ) );
				}
				
				model.addAttribute( "grupo" , grupo );
				model.addAttribute( "permissoesMap" , reordenadoMap );
				
				return "editgrupo";
			}
		}
		
		return "index";
	}
	
	@RequestMapping("/alterarGrupo")
	public String altera(Grupo grupo, Model model, HttpServletRequest request) throws SQLException
	{
		/*
		 * Metodo revisado no dia 04/12 e testado;
		 * 
		 */
		
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for( Permissao p : permissaoList )
		{
			if( p.getModulo().equals("Grupo") && p.getItem().equals("alterar"))
			{
				GrupoDAO daoGrupo = new GrupoDAO(connection);	
				Map<String, Object> params = new LinkedHashMap<String, Object>();
				
				grupo.setCodEmpresa(codEmpresa);
				
				if(daoGrupo.getGrupoUp(grupo).isAlerta() == true)
				{
					model.addAttribute("permissoesList", daoPermissao.getLista());
					params.put("grupo", true);
					return "cadgrupo";
				}
				
				Map<String,List<String>> resultado = tratarParametros( request.getParameterMap() );
				grupo.setModuloPermissaoMap( resultado );
								
				daoGrupo.altera(grupo);
				return "redirect:listaGrupo";
			}
		}
		
		return "index";
	}
		
	@RequestMapping("/removeGrupo")
	public String remove(Grupo grupo, HttpServletRequest request)
	{
		/*
		 * Metodo revisado no dia 04/12 e testado;
		 * 
		 */
		
		Connection connection = (Connection) request.getAttribute("conexao");
		
		HttpSession session = request.getSession();
		Usuario usuario = (Usuario) session.getAttribute("usuarioLogado");
		PermissaoDAO daoPermissao = new PermissaoDAO(connection);
		UsuarioDAO daoUsuario = new UsuarioDAO(connection);
		int codEmpresa = daoUsuario.verificaEmpresa(usuario);
		List<Permissao> permissaoList = daoPermissao.verificaPermissao(codEmpresa,usuario,"item");
		
		for( Permissao p : permissaoList )
		{
			if( p.getModulo().equals("Grupo") && p.getItem().equals("remover"))
			{
				grupo.setCodEmpresa(codEmpresa);
				
				GrupoDAO dao = new GrupoDAO(connection);
				dao.remove(grupo);
				return "redirect:listaGrupo";
			}
		}
		
		return "index";		
	}
	
}


